package com.etc.controller;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.etc.entity.Admin;
import com.etc.entity.Business;
import com.etc.entity.Customer;
import com.etc.service.LoginService;
import com.etc.service.impl.LoginServiceImpl;

/**
 * Servlet implementation class LoginServlet
 */
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	private LoginService loginService = new LoginServiceImpl();
	
    /**
     * @see HttpServlet#HttpServlet()
     */
    public LoginServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 设置请求编码格式
		request.setCharacterEncoding("UTF-8");
		
		// 通过标识符区分不同的请求
		String op = request.getParameter("op");
		
		if ("adminLogout".equals(op)) {
			// 系统后台退出登录的请求
			// 执行退出操作,清除管理员登录信息
			request.getSession().removeAttribute("admin");
			// 重定向,跳转到系统后台登录页
			response.sendRedirect(request.getContextPath() + "/back/admin/login.jsp");
		} else if("businessLogout".equals(op)) {
			// 系统前台退出登录的请求
			// 执行退出操作,清除用户登录信息
			request.getSession().removeAttribute("business");
			// 重定向,跳转到系统前台登录页
			response.sendRedirect(request.getContextPath() + "/back/business/login.jsp");
		} else if("customerLogout".equals(op)) {
			// 系统前台退出登录的请求
			// 执行退出操作,清除用户登录信息
			request.getSession().removeAttribute("customer");
			// 重定向,跳转到系统前台登录页
			response.sendRedirect(request.getContextPath() + "/front/sign.jsp");
		} else {
			// 1.接收登录的请求
			// 接收请求参数
			String mobile = request.getParameter("mobile");
			String password = request.getParameter("password");
			
			Integer role = Integer.valueOf(request.getParameter("role"));
		
		
			// 对请求参数进行校验
			// .....

			// 2.调用业务层
			
			
			
			Object object = loginService.login(mobile, password, role);
			
			if (object != null) {
				// 登录成功
				// 将登录状态存储session中
				if (role == 1) {
					// 管理员
					Admin admin = (Admin) object;
					request.getSession().setAttribute("admin", admin);
					
					// 判断管理员是否选择记住密码,如果选择,则在响应头中添加cookie保存用户信息
					// 获取记住密码的参数项
					String remember = request.getParameter("remember");
					
					// 判断
					if("on".equals(remember)) {  // 记住密码
						// 服务器发送一组cookie给浏览器
						// 创建cookie对象
						Cookie cookie  = new Cookie("rememberMe",mobile+"="+password);// rememberMe="15606958069=123456"
						// 设置年龄
						cookie.setMaxAge(60*60*24); // 24小时
						// 添加到响应头中
						response.addCookie(cookie);
						
					}else if (remember == null) { // 没有记住密码
						// 读取现有的cookie
						Cookie[] cookies = request.getCookies();
						for (Cookie cookie : cookies) {
							if("rememberMe".equals(cookie.getName())) {
								// 设置年龄为0表示删除
								// 设置年龄
								cookie.setMaxAge(0); // 0
								// 添加到响应头中
								response.addCookie(cookie);
							}
						}
					}					
					
					// 3.响应
					// 管理员登录成功跳转到系统后台首页
					// 设置响应编码格式
					response.setCharacterEncoding("utf-8");
					// 设置响应内容类型
					response.setContentType("text/html;charset=utf-8");
					// 设置响应页面
					// 重定向
					response.sendRedirect(request.getContextPath() + "/back/admin/index.jsp");
				} else if (role == 2) {
					// 商家
					Business business = (Business) object;
					request.getSession().setAttribute("business", business);
					
					// 判断商家是否选择记住密码,如果选择,则在响应头中添加cookie保存商家信息
					// 获取记住密码的参数项
					String remember = request.getParameter("remember");
					
					// 判断
					if("on".equals(remember)) {  // 记住密码
						// 服务器发送一组cookie给浏览器
						// 创建cookie对象
						Cookie cookie  = new Cookie("rememberMe",mobile+"="+password);// rememberMe="15606958069=123456"
						// 设置年龄
						cookie.setMaxAge(60*60*24); // 24小时
						// 添加到响应头中
						response.addCookie(cookie);
						
					}else if (remember == null) { // 没有记住密码
						// 读取现有的cookie
						Cookie[] cookies = request.getCookies();
						for (Cookie cookie : cookies) {
							if("rememberMe".equals(cookie.getName())) {
								// 设置年龄为0表示删除
								// 设置年龄
								cookie.setMaxAge(0); // 0
								// 添加到响应头中
								response.addCookie(cookie);
							}
						}
					}
					// 3.响应
					// 商家登录成功跳转到系统前台首页
					// 设置响应编码格式
					response.setCharacterEncoding("utf-8");
					// 设置响应内容类型
					response.setContentType("text/html;charset=utf-8");
					// 设置响应页面
					// 重定向
					response.sendRedirect(request.getContextPath() + "/back/business/index.jsp");
				} else if (role == 3) {// 用户
					
					// 验证码
					String code = request.getParameter("code");
					HttpSession session = request.getSession();
					String randomString = (String)session.getAttribute("randomString");
					
					if(code == null || code.isEmpty() || !code.equals(randomString)) {
						
						// 验证码错误导致登录失败
						// 设置响应编码格式
						response.setCharacterEncoding("utf-8");
						// 设置响应内容类型
						response.setContentType("text/html;charset=utf-8");
						// 设置响应页面
						// 根据角色重定向到系统前后登录或后台登录
						response.sendRedirect(request.getContextPath() + "/front/sign.jsp?code=fail");
						return;
					}
					
					
					// 用户
					Customer customer = (Customer) object;
					// 账户是否冻结：0是冻结1是正常
					if(customer.getStatus()==0) {
						// 账户冻结导致登录失败
						// 设置响应编码格式
						response.setCharacterEncoding("utf-8");
						// 设置响应内容类型
						response.setContentType("text/html;charset=utf-8");
						// 设置响应页面
						// 根据角色重定向到系统前后登录或后台登录
						response.sendRedirect(request.getContextPath() + "/front/sign.jsp?status=fail");
						return;
					}
					
					
					
					request.getSession().setAttribute("customer", customer);
					
					// 判断用户是否选择记住密码,如果选择,则在响应头中添加cookie保存用户信息
					// 获取记住密码的参数项
					String remember = request.getParameter("remember");
					
					// 判断
					if("".equals(remember)) {  // 记住密码                这里判断 之前是"on".equals(remember)
						// 服务器发送一组cookie给浏览器
						// 创建cookie对象
						Cookie cookie  = new Cookie("rememberMe",mobile+"="+password);// rememberMe="15606958069=123456"
						// 设置年龄
						cookie.setMaxAge(60*60*24); // 24小时
						// 添加到响应头中
						response.addCookie(cookie);
						
					}else { // 没有记住密码                                                           这里判断 之前是remember==null
						// 读取现有的cookie
						Cookie[] cookies = request.getCookies();
						for (Cookie cookie : cookies) {
							if("rememberMe".equals(cookie.getName())) {
								// 设置年龄为0表示删除
								// 设置年龄
								cookie.setMaxAge(0); // 0
								// 添加到响应头中
								response.addCookie(cookie);
							}
						}
					}
					// 3.响应
					// 用户登录成功跳转到系统前台首页
					// 设置响应编码格式
					response.setCharacterEncoding("utf-8");
					// 设置响应内容类型
					response.setContentType("text/html;charset=utf-8");
					// 设置响应页面
					// 重定向
					response.sendRedirect(request.getContextPath() + "/front/index.jsp");
				}
			} else {
				// 登录失败
				// 设置响应编码格式
				response.setCharacterEncoding("utf-8");
				// 设置响应内容类型
				response.setContentType("text/html;charset=utf-8");
				// 设置响应页面
				// 根据角色重定向到系统前后登录或后台登录
				if (role == 1) {
					response.sendRedirect(request.getContextPath() + "/back/admin/login.jsp?message=fail");
				} else if (role == 2) {
					response.sendRedirect(request.getContextPath() + "/back/business/login.jsp?message=fail");
				} else if (role == 3) {
					response.sendRedirect(request.getContextPath() + "/front/sign.jsp?message=fail");
				}

			}
		}
	}

}
